МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Звіт
про виконання лабораторної роботи №4
з курсу
“ Програмування комп’ютерної графіки”
Львів – 2011
Мета роботи: набути практичних навиків в складанні програм для побудови рухомих зображень на екрані комп’ютера за допомогою матричних перетворень.
ЗАВДАННЯ
Написати програму мовою С++,що дозволяє сформувати на екрані комп’ютера рухоме зображення, використовуючи матричні операції.
Таблиця 1. Завдання до лабораторної роботи
№
варіанту
Структура зображення
Пояснення
3
d a
Рух кульки по видимому ромбовидимму контуру проти годинникової стрілки.
Кольори кульки і контуру різні.
Параметри: d=18; a=50
Список змінних, які використовуються в коді програми, та їх пояснення:
K, C, d, r, a, f, x, y, x1, y1, x2, y2, x3, y3, i, f- змінні типу double.
BOOL Rectangle(int x1,int y1,int x2,int y2 )- малює прямокутник х1, у1 задають координати верхнього лівого кута, а х2, у2 правого нижнього кута прямокутника. При успішному виконанні функція повертає TRUE, інакше FALSE.
BOOL Ellipse(int x1,int y1,int x2,int y2 )- малює еліпс х1, у1 задають координати верхнього лівого кута, а х2, у2 правого нижнього кута прямокутника, який визначає розміри еліпса. При успішному виконанні функція повертає TRUE, інакше FALSE.
BOOL CreateSolidBrush(COLORREF crColor )-ініціалізує суцільний пензель заданими атрибутами. crColor задає колір пензля.
Блок-схема алгоритму програми:
Остаточна версія програми:
// ChildView.cpp : implementation of the CChildView class
//
#include "stdafx.h"
#include "lab 4.h"
#include "ChildView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CChildView
CChildView::CChildView()
{
}
CChildView::~CChildView()
{
}
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
// CChildView message handlers
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);
return TRUE;
}
#include "math.h"
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CWnd::OnPaint() for painting messages
double K = 4;
double C = 20 * K;
double d = 18 * K;
double r = d / 2.0;
double a = 50 * K;
double f = 100;
int sleep = 3;
double n32 = sqrt(3.0) / 3.45;
CPoint p[4];
p[0].x = C; p[0].y = C + (n32 * a);
p[1].x = C + a / 2.0; p[1].y = C;
p[2].x = C + a; p[2].y = C + (n32 * a);
p[3].x = C + a / 2.0; p[3].y = C + 2*(n32 * a);
dc.Polygon(p,4);
double x,y, x1,y1,x2,y2,x3,y3;
x = a / f / 2.0; y = n32 / f;
CBrush bBlue;
bBlue.CreateSolidBrush(RGB(0, 120, 0));
x1 = p[0].x - r; y1= p[0].y - r;
x2 = p[0].x + r; y2= p[0].y + r;
dc.SelectStockObject(NULL_PEN);
dc.SelectObject(bBlue);
dc.Ellipse(x1,y1, x2,y2);
for (int i = 0; i < f*4; i++)
{
if (i > 0 && i <= f)
{
x = a / f / 2.0; y = a * n32 / f;
}
if (i > f && i <= f*2)
{
x = a / f / 2.0; y = -a * n32 / f;
}
if (i > f*2 && i <= f*3)
{
x = -a / f / 2.0; y = -a * n32 / f;
}
if (i > f*3 && i <= f*4)
{
x = -a / f / 2.0; y = a * n32 / f;
}
x1 += x; y1 += y; x2 += x; y2 += y;
dc.SelectStockObject(WHITE_BRUSH);
dc.SelectStockObject(NULL_PEN);
dc.Rectangle(0,0, 1000,1000);
dc.SelectStockObject(BLACK_PEN);
dc.Polygon(p,4);
dc.SelectStockObject(NULL_PEN);
dc.SelectObject(bBlue);
dc.Ellipse(x1,y1, x2,y2);;
Sleep(sleep);
GdiFlush();
}
}
Результат роботи програми:
Висновок: При виконанні даної лабораторної роботи я набув практичних навиків у скаданні програм для побудови рухомих зображень на екрані комп’ютера за допомогою матричних перетворень у середовищі Microsoft Visual Studio C++ 2008.
Список змінних, які використовуються в коді програми, та їх пояснення:
Xmash, ...